package com.mirai.mirai_boot.service.impl;

import catcode.CatCodeUtil;
import catcode.CodeTemplate;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.mirai.mirai_boot.configure.DefaultSchedulingConfigurer;
import com.mirai.mirai_boot.entity.Idiom;
import com.mirai.mirai_boot.mapper.IdiomMapper;
import com.mirai.mirai_boot.service.IdiomService;
import com.mirai.mirai_boot.utils.PinyinUtils;
import com.mirai.mirai_boot.vo.IdiomVo;
import love.forte.simbot.api.message.containers.GroupAccountInfo;
import love.forte.simbot.api.message.events.GroupMsg;
import love.forte.simbot.api.sender.Sender;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.config.TriggerTask;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.net.URL;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;

@Service
public class IdiomServiceImpl extends ServiceImpl<IdiomMapper, Idiom> implements IdiomService {

    @Autowired
    private IdiomMapper idiomMapper;

    @Autowired
    private DefaultSchedulingConfigurer defaultSchedulingConfigurer;

    private Map<String, IdiomVo> map = new HashMap<>();


    @Override
    public Integer addIdioms(List<Idiom> idioms) {
        return idiomMapper.addIdioms(idioms);
    }

    @Override
    public Idiom findIdiom(String idiom, String firstSpell) {
        // 调用工具类 匹配成语开头是否匹配
        String pingyin = PinyinUtils.getPingyin(idiom.substring(0, 1));
        // 成功匹配 验证成语是否存在并返回结果
        if (firstSpell.equals(pingyin)) {
            // 得到返回结果
            return idiomMapper.findIdiom(idiom);
        }
        return null;
    }

    @Override
    public Integer addidiom(String para) throws IOException {
        String url = "https://hanyu.baidu.com/s?wd=" + para;

        // 解析网页 （Jsou返回的Document就是浏览器的Docuement对象）
        Document document = Jsoup.parse(new URL(url), 6000);
        Element elementById = document.getElementById("jielong-wrapper");
        if (elementById != null) {
            // 百度确定存在该成语,数据库进行学习
            String firstSpell = PinyinUtils.getPingyin(para.substring(0, 1));
            String tallSpell = PinyinUtils.getPingyin(para.substring(para.length() - 1, para.length()));

            Idiom idiom = new Idiom();
            idiom.setIdiomName(para);
            idiom.setFirstSpell(firstSpell);
            idiom.setTallSpell(tallSpell);
            return this.baseMapper.insert(idiom);
        }

        return null;
    }

    /**
     * 成语接龙 开始游戏
     *
     * @param para
     * @param msg
     * @param sender
     * @throws IOException
     */
    @Override
    public void startGame(String para, GroupMsg msg, Sender sender) throws IOException {

        // 获取群号
        String groupCode = msg.getGroupInfo().getGroupCode();

        // 生成数据
        IdiomVo idiomVo = map.get(groupCode);
        if (idiomVo == null) {
            idiomVo = new IdiomVo();
            // 添加群号
            idiomVo.setGroupCode(groupCode);
        }

        // 获取群组账号信息
        GroupAccountInfo accountInfo = msg.getAccountInfo();
        // 群消息发送者账号
        String accountCode = accountInfo.getAccountCode();
        // 最后访问时间戳
        idiomVo.setLastSpeech(accountInfo.getLastSpeakTime() / 1000);
        System.out.println("最后回复时间：>>>" + idiomVo.getLastSpeech());


        // 获取猫猫码工具
        CatCodeUtil util = CatCodeUtil.INSTANCE;
        // 获取字符串模板
        CodeTemplate<String> template = util.getStringTemplate();
        String at = template.at(accountCode);


        // 定义定时任务
        IdiomVo finalIdiomVo = idiomVo;
        TriggerTask triggerTask = new TriggerTask(() -> {
            int i = (int) (System.currentTimeMillis() / 1000);
            int w = (int) (i - finalIdiomVo.getLastSpeech());
            if (w > 150) {

                sender.sendGroupMsg(msg, "成语接龙已经关闭~");
                System.out.println("成语接龙缓存清除>>>>>" + groupCode);
                // 清除map缓存
                map.remove(finalIdiomVo.getGroupCode());
                // 关闭定时器
                defaultSchedulingConfigurer.cancelTriggerTask(groupCode);

            }
        }, new CronTrigger("0 0/10 * * * ?"));

        if (idiomVo.getFirstSpell() == null || idiomVo.getFirstSpell().equals("")) {
            // 随机产生成语
            Random random = new Random();
            int i = random.nextInt(6000);
            Idiom random1 = this.idiomMapper.getRandom(i);
            para = random1.getIdiomName();

            // 定义当前开始成语拼音
            idiomVo.setFirstSpell(PinyinUtils.getPingyin(random1.getTallSpell()));
            // 游戏正式开始
            idiomVo.setToStart(true);
            idiomVo.setUserCode(accountCode);
            map.put(groupCode, idiomVo);

            // 开启定时任务
            defaultSchedulingConfigurer.addTriggerTask(groupCode, triggerTask);
            System.out.println("定时任务开启>>>>>>>" + groupCode);

            sender.sendGroupMsg(msg, "成语接龙开始： " + para + "\n当前成语开头为：" + idiomVo.getFirstSpell() + "\n成语接龙格式为>>>>>>>成语接龙 步步为营");
        }else if (para == null) {

            sender.sendGroupMsg(msg, "当前开头成语为：" + idiomVo.getFirstSpell() + "\n成语接龙格式为>>>>>>>成语接龙 步步为营");

        } else if (idiomVo.getUserCode().equals(accountCode)) {
            sender.sendGroupMsg(msg, at + "您已经抢答过了，请把机会让给其他人~");
        } else if (!para.equals("")) {
            // 匹配当前成语是否正确
            Idiom idiom = this.findIdiom(para, idiomVo.getFirstSpell());
            if (idiom != null) {


                // 更新数据
                idiomVo.setFirstSpell(idiom.getTallSpell());
                idiomVo.setUserCode(accountCode);
                map.put(groupCode, idiomVo);

                sender.sendGroupMsg(msg, at + "当前成语开头为：" + idiomVo.getFirstSpell());
            } else if (para.length() == 4) {

                // 更新数据
                idiomVo.setFirstSpell(PinyinUtils.getPingyin(para.substring(para.length() - 1)));
                idiomVo.setUserCode(accountCode);
                map.put(groupCode, idiomVo);

                // 词库未查询到数据，尝试去网站爬取，并保持到数据库中进行学习
                Integer addidiom = this.addidiom(para);
                sender.sendGroupMsg(msg, at + addidiom == null ? "没有该成语" : "当前成语开头为" + idiomVo.getFirstSpell());
            }

        }
    }
}
